package org.ma1.cripto.aes.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.swing.JEditorPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentListener;

public class TextoPanel extends JPanel implements IListener, KeyListener {
	
	private boolean modificado = false;
	private TitledBorder borde;
	private String nombreTexto;
	private JEditorPane texto;
	
	private Color[] colores = {Color.green.darker(), Color.blue, Color.red, Color.orange, Color.magenta};
	
	public TextoPanel() {
		super();
		this.setLayout(new BorderLayout());
		texto = new JEditorPane();
		texto.addKeyListener(this);
		try {
			Font fuente = Font.createFont(Font.TRUETYPE_FONT, TextoPanel.class.getResourceAsStream("res/Sophie.ttf")).deriveFont(24.0f);
			texto.setFont(fuente);
			texto.setForeground(colores[new Random().nextInt(colores.length)]);
		} catch (FontFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		JScrollPane scroll = new JScrollPane(texto);
		this.add(scroll, BorderLayout.CENTER);
		this.setBorder(borde=new TitledBorder(""));
	}

	public void addDocumentListener(DocumentListener l) {
		texto.getDocument().addDocumentListener(l);
	}
	
	public String getNombre() {
		return nombreTexto;
	}

	public void setNombre(String nombre) {
		this.nombreTexto = nombre;
		this.borde.setTitle(nombre);
		repaint();
	}

	public void keyPressed(KeyEvent arg0) {
	}

	public void keyReleased(KeyEvent arg0) {
	}

	public void keyTyped(KeyEvent arg0) {
		setModificado(true);
	}

	public boolean isModificado() {
		return modificado;
	}

	public void setModificado(boolean modificado) {
		this.modificado = modificado;
		String resultado = getFecha();
		if (modificado) {
			this.borde.setTitle(nombreTexto+" - Modificado ("+resultado+")");
			this.repaint();
		} else {
			this.borde.setTitle(nombreTexto+" - Guardado ("+resultado+")");
			this.repaint();
		}
	}

	public void handle(int tipo, String txt) {
		if (tipo==IListener.TIPO_CARGAR_TEXTO) {
			texto.setText(txt);
			this.borde.setTitle(nombreTexto+" - Cargado ("+getFecha()+")");
			this.repaint();
		} else if (tipo==IListener.TIPO_GUARDAR_TEXTO) {
			setModificado(false);
		}
	}
	
	private String getFecha() {
		SimpleDateFormat formato = new SimpleDateFormat("hh:mm:ss ' del ' d MMM yy");
		Date today = new Date();
		String resultado = formato.format(today);
		return resultado;
	}

	public String getText() {
		return texto.getText();
	}
}
